ffmpeg | 您所在的位置:网站首页 › nvidia解码 ffmpeg open 崩溃 › ffmpeg |
最近我将ffmpeg从0.9升级到1.0(在Win7x64和iOS上测试),现在avcodec_decode_video2seagfaults。长话短说:每次视频尺寸发生变化(例如从 320x240 到 160x120 或反之亦然)时,都会发生崩溃。 我从某些专有源接收 mpeg4 视频流并按如下方式对其进行解码: // once, during initialization: AVCodec *codec_ = avcodec_find_decoder(CODEC_ID_MPEG4); AVCodecContext ctx_ = avcodec_alloc_context3(codec_); avcodec_open2(ctx_, codec_, 0); AVPacket packet_; av_init_packet(&packet_); AVFrame picture_ = avcodec_alloc_frame(); // on every frame: int got_picture; packet_.size = size; packet_.data = (uint8_t *)buffer; avcodec_decode_video2(ctx_, picture_, &got_picture, &packet_);同样,在我升级到 1.0 之前,上述所有操作都完美无缺。现在,每当帧尺寸发生变化时,avcodec_decode_video2就会崩溃。请注意,我没有在 AVCodecContext 中分配宽度/高度 - 无论是在开始时,还是在流更改时 - 这可能是原因吗? 如果有任何想法,我将不胜感激! 更新:设置 ctx_.width 和 ctx_.height 没有帮助。 更新2:在崩溃之前我收到以下日志消息: mpeg4, level 24: "Found 2 unreleased buffers!". level 8: "Assertion i < avci->buffer_count failed at libavcodec/utils.c:603" Update3 升级到 1.1.2 修复了此崩溃。解码器再次能够应对动态尺寸变化。 最佳答案 您可以尝试填充AVPacket::side_data。如果更改帧大小,编解码器会从中接收信息(请参阅libavcodec/utils.c apply_param_change函数) 该结构可以按如下方式填充: int my_ff_add_param_change(AVPacket *pkt, int32_t width, int32_t height) { uint32_t flags = 0; int size = 4 * 3; uint8_t *data; if (!pkt) return AVERROR(EINVAL); flags = AV_SIDE_DATA_PARAM_CHANGE_DIMENSIONS; data = av_packet_new_side_data(pkt, AV_PKT_DATA_PARAM_CHANGE, size); if (!data) return AVERROR(ENOMEM); ((uint32_t*)data)[0] = flags; ((uint32_t*)data)[1] = width; ((uint32_t*)data)[2] = height; return 0; }每次大小变化时都需要调用此函数。 我认为这个功能最近才出现。直到我查看新的 ffmpeg 源代码时我才知道这一点。 UPD 正如您所写,解决问题的最简单方法是重新启动编解码器。只需调用 avcodec_close/avcodec_open2 关于ffmpeg - ffmpeg 升级后解码器崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13688992/ |
CopyRight 2018-2019 实验室设备网 版权所有 |